#include "SqList.h"
#include <stdio.h>
void InitList(PSqList L)//构造一个空的线性表L
{
	L->length=0;
}
void ClearList(PSqList L)//清空线性表L
{
	L->length=0;
	printf("\n已执行清空线性表L！\n"); 
}
Status IsEmptyList(PSqList L)//若L为空表，则返回TRUE,否则返回FALSE
{
	if(L->length==0)
	{
		return TRUE;
	} 
	else
	{
		return FALSE;
	}
}
DataType ListLength(PSqList L)//返回L中数据元素个数
{
	return L->length;
}
DataType GetElem(PSqList L,DataType i,Pt e)//用e返回L中第i个元素的值,操作成功返回其值，否则返回-6699
{
	if(L->length==0||i>L->length)
	{
		return -6699;
	}
	else
	{
		return *e=L->data[i-1];
	}
}
DataType LocateElem(PSqList L,DataType e)//返回e在L中的位置,有该数据元素则返回其位置，否则返回0 
{
	DataType i;
	for(i=0;i<L->length;i++)
	{
		if(L->data[i]==e)
		{
			return i+1;
		}
	}
	return 0;
}
Status PriorElem(PSqList L,DataType e,Pt proe)//若e是L的数据元素，且不是第一个，则用proe返回它的前驱。操作成功返回OK,否则返回-6699 
{
	DataType i;
	i=LocateElem(L,e);
	if(i>=2)
	{
		*proe=L->data[i-1-1];
		return OK;
	}
	else
	{
		if(i==0)
		{
			*proe=-6699;
			printf("\n该元素:%d不在L中！无法找其前驱！\n",e);
			return -6699;
		}
		else
		{
			if(i==1)
			{
				*proe=-6699;
				printf("\n该元素是第一个元素，无前驱！\n");
				return -6699;
			}
		}
	}
	return -6699;
}
Status NextElem(PSqList L,DataType e,Pt nexte)//若e是L的数据元素，且不是最后一个，则用nexte返回它的后继。操作成功返回OK,否则返回-6699
{
	DataType i;
	i=LocateElem(L,e);
	if(i>=1&&i<=L->length-1)
	{
		*nexte=L->data[i-1+1];
		return OK;
	}
	else
	{
		if(i==0)
		{
			*nexte=-6699;
			printf("\n该元素:%d不在L中！无法找其后继！\n",e);
			return -6699;
		}
		else
		{
			if(i==L->length)
			{
				*nexte=-6699;
				printf("\n该元素是最后一个元素，无后继！\n");
				return -6699;
			}
		}
	}
	return -66999;
}
Status ListInsert(PSqList L,DataType i,DataType e)//在L第i个位置之前插入新的元素e，L长度加1,成功操作返回OK，否则返回ERROR
{
	if(i<1||i>L->length+1) 
	{
		printf("\n插入位置：%d不合法！\n",i);
		return ERROR;
	}
	else
	{
		if(ListLength(L)>=ListSize)
		{
			printf("\n该L表已满！\n");
			return ERROR;
		}
		else
		{
			DataType k;
			for(k=L->length-1;k>=i-1;k--)
			{
				L->data[k+1]=L->data[k];
			}
			L->data[i-1]=e;
			L->length++;
			return OK;
		}
	}
}
DataType ListDelete(PSqList L,DataType i,Pt e)//删除L的第i个数据元素，并用e返回其值，L长度减1,操作成功返回删除的值，否则返回ERROR 
{
	if(ListLength(L)==0)
	{
		printf("\n表为空，不能执行删除元素！\n");
		return ERROR;
	}
	else
	{
		if(i>ListLength(L))
		{
			printf("删除位置超过表长，非法删除！\n\n");
			return ERROR;
		}
		else
		{
			*e=L->data[i-1];
			DataType k;
			for(k=i;k<L->length;k++)
			{
				L->data[k-1]=L->data[k];
			}
			L->length--;
			return *e;
		} 
	}
}
Status ListTraverse(PSqList L)//依次对L每个数据元素调用函数,成功遍历返回OK，否则返回ERROR
{
	DataType k;
	if(IsEmptyList(L)==1)
	{
		printf("\n遍历失败！表L为空！\n");
		return ERROR; 
	}
	else
	{
		for(k=0;k<L->length;k++)
		{
			if(k==0)
			{
				printf("开始遍历L：%d",L->data[k]);
			}
			else
			{
				printf(" %d",L->data[k]);
			}
		} 
		printf("\n");
		return OK;
	}
}